package fr.afcepf.atod16.groupe1.projet1.dao.catalogue;

import fr.afcepf.atod16.groupe1.projet1.dao.DaoAbstract;
import fr.afcepf.atod16.groupe1.projet1.dao.DaoAssembleur;
import fr.afcepf.atod16.groupe1.projet1.dto.catalogue.DtoCategorieProduit;
import fr.afcepf.atod16.groupe1.projet1.dto.catalogue.DtoSousCategorieProduit;
import fr.afcepf.atod16.groupe1.projet1.entities.catalogue.CategorieProduit;
import fr.afcepf.atod16.groupe1.projet1.entities.catalogue.SousCategorieProduit;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.LockTimeoutException;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.persistence.PessimisticLockException;
import javax.persistence.QueryTimeoutException;
import javax.persistence.TransactionRequiredException;
import javax.persistence.criteria.CriteriaQuery;

/**
 * Implementation de la DAO categories produits avec JPA
 * @author cedric
 */
@Stateless
public class DaoCategorieProduitJpa extends DaoAbstract<CategorieProduit, DtoCategorieProduit> implements DaoCategorieProduit {

    @PersistenceContext(unitName = "projet1c-ejbPU")
    private EntityManager em;

    /**
     * Surcharge la fonction de récupération de l'entityManager car le contexte
     * de persistance est injecté dans la classe.
     * @return L'entityManager
     */
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    /**
     * Constructeur fournissant à la superclasse l'objet Class de l'entité
     */
    public DaoCategorieProduitJpa() {
        super(CategorieProduit.class);
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoCategorieProduit> listerRecursif() {
        List<CategorieProduit> entites;
        List<SousCategorieProduit> entites2;
        DtoCategorieProduit dto;
        DtoSousCategorieProduit dto2;
        List<DtoCategorieProduit> dtos = new ArrayList<DtoCategorieProduit>();
        List<DtoSousCategorieProduit> dtos2;
        
        try {
            CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
            cq.select(cq.from(CategorieProduit.class));
            entites = getEntityManager().createQuery(cq).getResultList();

            for (CategorieProduit entite : entites) {
                dto = DaoAssembleur.createDto(entite);
                dtos2 = new ArrayList<DtoSousCategorieProduit>();
                entites2 = entite.getSousCategories();
                for (SousCategorieProduit entite2 : entites2) {
                    dto2 = DaoAssembleur.createDto(entite2);
                    dtos2.add(dto2);
                }
                dto.setSousCategories(dtos2);
                dtos.add(dto);
            }
        }
        catch(IllegalStateException e) {
            System.out.println("entity manager fermé OU requete non autorisé");
        }
        catch(IllegalArgumentException e) {
            System.out.println("probleme de criteria");
        }
        catch(QueryTimeoutException e) {
            System.out.println("query timeout");
        }
        catch(TransactionRequiredException e) {
            System.out.println("transaction required !");
        }
        catch(PessimisticLockException e) {
            System.out.println("echec de lock");
        }
        catch(LockTimeoutException e) {
            System.out.println("echec de lock");
        }
        catch(PersistenceException e) {
            System.out.println("query timeout");
        }

        return dtos;
    }
    
    
}
